#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
文件: stub_misc_api.py
位置: backend/api/miniprogram/stub_misc_api.py
目的: 为当前小程序前端已存在但后端尚未实现的接口提供最小可用占位实现，
      避免出现大量 404 / 网络错误，支撑后续逐步替换为真实业务逻辑。

设计原则:
1. 所有返回结构尽量符合前端当前判断逻辑: { code 或 success, data }
2. 不进行复杂查询，返回空集合或默认统计值；保留字段名，方便前端直接渲染。
3. 仅限临时占位，添加 clear TODO 标记，后续迭代时逐步实现真实逻辑。
4. 不影响现有已实现的 miniprogram 真实接口（避免命名/路由冲突）。
5. 使用 @jwt_required() 保护需要登录的接口，保持与前端调用场景一致。

注意: 前端有两套 baseUrl 使用方式 (config.baseUrl 与 app.globalData.apiBaseUrl)。
     当前开发环境下应统一迁移到 app.globalData.apiBaseUrl（指向 /api/miniprogram）。
     在迁移完成前，这里的路由前缀保持 /api/miniprogram 下，确保前端已经改为该前缀后可用。
"""

from flask import jsonify, request
from flask_jwt_extended import jwt_required, get_jwt_identity
from datetime import datetime

from backend.api.miniprogram import miniprogram_bp

# ---------- 用户安全状态 ----------
@miniprogram_bp.route('/user/security-status', methods=['GET'])
@jwt_required()
def get_security_status():
    """用户安全状态占位实现
    前端期望: { code:0, data:{ hasPassword, hasPhone, loginDevices, lastLoginTime } }
    TODO: 替换为真实密码存在校验 / 设备管理 / 最近登录时间获取逻辑
    """
    try:
        user_id = get_jwt_identity()
        # 简化判定: 仅根据是否有 password_hash / mobile 字段（需在真实实现中查询 User 模型）
        # 为避免额外依赖导入，仅返回默认值，后续扩展时可引入 User 查询。
        data = {
            'hasPassword': True,   # 占位: 视为已设置
            'hasPhone': True,      # 占位: 视为已绑定（前端已展示手机号）
            'loginDevices': 1,     # 占位: 当前设备
            'lastLoginTime': datetime.utcnow().isoformat() + 'Z'
        }
        return jsonify({'code': 0, 'data': data})
    except Exception as e:
        return jsonify({'code': 500, 'message': f'获取安全状态失败: {str(e)}'}), 500

# ---------- 统一记录统计 & 列表 ----------
@miniprogram_bp.route('/records/statistics', methods=['GET'])
@jwt_required()
def get_records_statistics():
    """数据记录统计占位"""
    try:
        # 直接返回全部为0结构，字段名与前端匹配
        stats = {
            'totalRecords': 0,
            'visionRecords': 0,
            'interventionRecords': 0,
            'socialRecords': 0
        }
        return jsonify({'code': 0, 'data': stats})
    except Exception as e:
        return jsonify({'code': 500, 'message': f'获取记录统计失败: {str(e)}'}), 500

@miniprogram_bp.route('/records', methods=['GET'])
@jwt_required()
def list_records():
    """数据记录列表占位: 返回空列表与分页信息"""
    try:
        page = int(request.args.get('page', 1))
        limit = int(request.args.get('limit', 20))
        records = []  # TODO: 后续聚合 vision/intervention/social 数据
        return jsonify({'code': 0, 'data': {'records': records, 'page': page, 'limit': limit}})
    except Exception as e:
        return jsonify({'code': 500, 'message': f'获取记录失败: {str(e)}'}), 500

# ---------- 随访统计 & 列表 ----------
@miniprogram_bp.route('/followup/statistics', methods=['GET'])
@jwt_required()
def get_followup_statistics():
    try:
        stats = {
            'total': 0,
            'pending': 0,
            'completed': 0,
            'overdue': 0
        }
        return jsonify({'code': 0, 'data': stats})
    except Exception as e:
        return jsonify({'code': 500, 'message': f'获取随访统计失败: {str(e)}'}), 500

@miniprogram_bp.route('/followup', methods=['GET'])
@jwt_required()
def list_followups():
    try:
        page = int(request.args.get('page', 1))
        limit = int(request.args.get('limit', 20))
        followups = []  # TODO: 绑定学生的随访记录聚合
        return jsonify({'code': 0, 'data': {'followups': followups, 'page': page, 'limit': limit}})
    except Exception as e:
        return jsonify({'code': 500, 'message': f'获取随访记录失败: {str(e)}'}), 500

# ---------- 导出接口 ----------
@miniprogram_bp.route('/export/history', methods=['GET'])
@jwt_required()
def export_history():
    try:
        history = []  # TODO: 从导出任务表或日志中获取
        return jsonify({'code': 0, 'data': history})
    except Exception as e:
        return jsonify({'code': 500, 'message': f'获取导出历史失败: {str(e)}'}), 500

@miniprogram_bp.route('/export', methods=['POST'])
@jwt_required()
def do_export():
    try:
        payload = request.get_json() or {}
        # 返回模拟导出结果
        result = {
            'taskId': 'stub-task',
            'fileName': 'export_stub.xlsx',
            'downloadUrl': ''  # 空表示无真实文件
        }
        return jsonify({'code': 0, 'data': result, 'message': '导出任务已创建(占位)'} )
    except Exception as e:
        return jsonify({'code': 500, 'message': f'导出失败: {str(e)}'}), 500

# ---------- 说明接口（可选） ----------
@miniprogram_bp.route('/__stubs/status', methods=['GET'])
def stub_status():
    """提供当前占位接口列表，便于排查与后续替换"""
    return jsonify({
        'success': True,
        'data': {
            'endpoints': [
                '/user/security-status',
                '/records/statistics', '/records',
                '/followup/statistics', '/followup',
                '/export/history', '/export'
            ],
            'note': 'These are temporary stub endpoints. Replace with real implementations incrementally.'
        }
    })
